package cn.dao;


import cn.entity.OrderEntity;
import cn.pojo.OrderDO;
import cn.pojo.OrderDO2;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.util.List;


/**
 * 经测试，JpaRepository的第一个参数填 OrderEntity 或 ProductEntity 均可出结果
 * <p>
 * 猜想1：
 * 应该是手写SQL进行多实体(即多表)查询时，填任意一个表的实体均可，但是第二个参数主键id类型要与前面填的实体对应
 * <p>
 * 猜想2：
 * 标注@Query方法的返回值优先级高于继承的JpaRepository的第一个形参指定的实体类型
 * 即在JPQL中 new 对象，那么就会按照所指定的对象返回吧，因此前面配置的返回值类型优先级就变低了
 * 但是不能不写，若是不继承JpaRepository会报错，若是只写继承JpaRepository不指定里面的两个参数依旧报错！
 * 且不继承加@Repository注解当dao层也不行，因为只有接口没实现类注入时导致空指针异常！
 * <p>
 * 推荐写法
 * 写连表查询中的任意一个实体(但推荐与接口名对应，如OrderDaoRepo里面就填OrderEntity)，不要写个无关的UserEntity
 * <p>
 * 注：以上均为自己测试所得结果和自己总结的，可能存在不正确现象！
 * =============================================================================================
 * <p>
 * 本项目中，直接使用 JPA 进行数据库操作的写在 repository 包下; 自己手写SQL的写在dao包下
 */
//public interface OrderDao extends JpaRepository<ProductEntity, Integer> {
public interface OrderDao extends JpaRepository<OrderEntity, Integer> {
    /**
     * 需求：根据订单号查询该订单下的所有商品信息
     */

    /**
     * 法一：返回值为普通java类(非实体、无@Entity注解)
     * 此时使用的是JPQL语言，注意操作对象是实体而非数据库中的表
     * new 的对象要写全路径，否则报异常:QuerySyntaxException: Unable to locate class [OrderDO]
     * <p>
     * 注：new的是普通类OrderDO，而from的是两个实体、对应连接查询时数据库中的俩表
     */
    @Query(value = "SELECT new cn.pojo.OrderDO(" +
            " x.orderId,\n" +
            " x.productId,\n" +
            " y.productName,\n" +
            " y.productPrice,\n" +
            " y.productFactory)\n  " +
            " FROM OrderEntity x\n" +
            " LEFT JOIN ProductEntity y\n" +
            " ON x.productId = y.productId\n" +
            " WHERE x.orderId = ?1")
    List<OrderDO> getOrderInfo(Integer orderId);
}
